#ifndef ORDERMANAGER_H
#define ORDERMANAGER_H

#include <QObject>
#include <QString>
#include <QDateTime>
#include <QHash>
#include <QMutex>
#include <QTimer>
#include <memory>
#include "../data/models.h"
#include "../data/datamanager.h"
#include "../business/menumanager.h"
#include "../utils/errorhandler.h"

// 前向声明
namespace RestaurantSystem {
    class UserManager;
}

/**
 * @brief 订单管理器
 * 
 * 负责订单创建、状态管理、流程控制等功能
 * 提供订单生命周期管理、库存联动、状态流转等服务
 */

namespace RestaurantSystem {

/**
 * @brief 订单操作结果枚举
 */
enum class OrderOperationResult {
    SUCCESS = 0,              // 操作成功
    ORDER_NOT_FOUND,         // 订单不存在
    INVALID_DATA,            // 数据无效
    INVALID_STATUS_CHANGE,   // 状态变更无效
    INSUFFICIENT_STOCK,      // 库存不足
    PERMISSION_DENIED,       // 权限不足
    SYSTEM_ERROR             // 系统错误
};

/**
 * @brief 订单创建请求
 */
struct OrderCreateRequest {
    QString customerId;
    QList<OrderItem> items;
    QString paymentMethod;
    QString notes;
    
    OrderCreateRequest() = default;
    OrderCreateRequest(const QString& customer, const QList<OrderItem>& orderItems, 
                      const QString& payment = "", const QString& orderNotes = "")
        : customerId(customer), items(orderItems), paymentMethod(payment), notes(orderNotes) {}
    
    bool isValid() const {
        return !customerId.isEmpty() && !items.isEmpty();
    }
};

/**
 * @brief 订单搜索条件
 */
struct OrderSearchCriteria {
    QString customerId;       // 顾客ID过滤
    QString customerName;     // 顾客名过滤
    OrderStatus status;       // 状态过滤
    QDateTime startDate;      // 开始日期
    QDateTime endDate;        // 结束日期
    double minAmount = -1;    // 最小金额
    double maxAmount = -1;    // 最大金额
    QString keyword;          // 关键词搜索
    
    OrderSearchCriteria() : status(static_cast<OrderStatus>(-1)) {}
    
    bool hasFilters() const {
        return !customerId.isEmpty() || !customerName.isEmpty() || status != static_cast<OrderStatus>(-1) ||
               startDate.isValid() || endDate.isValid() ||
               minAmount >= 0 || maxAmount >= 0 || !keyword.isEmpty();
    }
};

/**
 * @brief 订单统计信息
 */
struct OrderStatistics {
    int totalOrders = 0;
    int pendingOrders = 0;
    int preparingOrders = 0;
    int completedOrders = 0;
    int cancelledOrders = 0;
    double totalRevenue = 0.0;
    double averageOrderValue = 0.0;
    
    OrderStatistics() = default;
};

/**
 * @brief 订单管理器类
 */
class OrderManager : public QObject {
    Q_OBJECT
    
public:
    explicit OrderManager(QObject* parent = nullptr);
    ~OrderManager();
    
    /**
     * @brief 获取单例实例
     */
    static OrderManager& instance();
    
    /**
     * @brief 初始化订单管理器
     * @return 初始化是否成功
     */
    bool initialize();
    
    // ========================================================================
    // 订单创建和管理
    // ========================================================================
    
    /**
     * @brief 创建订单
     * @param request 订单创建请求
     * @return 操作结果和订单ID
     */
    QPair<OrderOperationResult, QString> createOrder(const OrderCreateRequest& request);
    
    /**
     * @brief 获取所有订单
     * @return 订单列表
     */
    QList<Order> getAllOrders();
    
    /**
     * @brief 根据ID获取订单
     * @param id 订单ID
     * @return 订单信息，不存在则返回无效对象
     */
    Order getOrderById(const QString& id);
    
    /**
     * @brief 根据顾客ID获取订单
     * @param customerId 顾客ID
     * @return 订单列表
     */
    QList<Order> getOrdersByCustomerId(const QString& customerId);
    
    /**
     * @brief 根据状态获取订单
     * @param status 订单状态
     * @return 订单列表
     */
    QList<Order> getOrdersByStatus(OrderStatus status);
    
    /**
     * @brief 搜索订单
     * @param criteria 搜索条件
     * @return 符合条件的订单列表
     */
    QList<Order> searchOrders(const OrderSearchCriteria& criteria);
    
    /**
     * @brief 取消订单
     * @param orderId 订单ID
     * @param reason 取消原因
     * @return 操作结果
     */
    OrderOperationResult cancelOrder(const QString& orderId, const QString& reason = "");
    
    /**
     * @brief 删除订单(仅限管理员)
     * @param orderId 订单ID
     * @return 操作结果
     */
    OrderOperationResult deleteOrder(const QString& orderId);
    
    // ========================================================================
    // 订单状态管理
    // ========================================================================
    
    /**
     * @brief 更新订单状态
     * @param orderId 订单ID
     * @param newStatus 新状态
     * @return 操作结果
     */
    OrderOperationResult updateOrderStatus(const QString& orderId, OrderStatus newStatus);
    
    /**
     * @brief 开始制作订单
     * @param orderId 订单ID
     * @return 操作结果
     */
    OrderOperationResult startPreparingOrder(const QString& orderId);
    
    /**
     * @brief 完成订单
     * @param orderId 订单ID
     * @return 操作结果
     */
    OrderOperationResult completeOrder(const QString& orderId);
    
    /**
     * @brief 检查状态变更是否有效
     * @param currentStatus 当前状态
     * @param newStatus 新状态
     * @return 是否有效
     */
    bool isValidStatusChange(OrderStatus currentStatus, OrderStatus newStatus);
    
    /**
     * @brief 获取可用的下一步状态
     * @param currentStatus 当前状态
     * @return 可用状态列表
     */
    QList<OrderStatus> getAvailableNextStatuses(OrderStatus currentStatus);
    
    // ========================================================================
    // 库存管理集成
    // ========================================================================
    
    /**
     * @brief 检查订单项目库存
     * @param items 订单项目列表
     * @return 是否所有项目库存充足
     */
    bool checkStockAvailability(const QList<OrderItem>& items);
    
    /**
     * @brief 预留库存
     * @param orderId 订单ID
     * @return 操作是否成功
     */
    bool reserveStock(const Order& order);
    
    /**
     * @brief 释放库存预留
     * @param orderId 订单ID
     * @return 操作是否成功
     */
    bool releaseStockReservation(const QString& orderId);
    
    /**
     * @brief 确认消耗库存
     * @param orderId 订单ID
     * @return 操作是否成功
     */
    bool confirmStockConsumption(const QString& orderId);
    
    // ========================================================================
    // 订单计算和验证
    // ========================================================================
    
    /**
     * @brief 计算订单总价
     * @param items 订单项目列表
     * @return 总价
     */
    double calculateOrderTotal(const QList<OrderItem>& items);
    
    /**
     * @brief 验证订单数据
     * @param order 订单信息
     * @return 验证结果
     */
    ValidationResult validateOrder(const Order& order);
    
    /**
     * @brief 验证订单项目
     * @param items 订单项目列表
     * @return 验证结果
     */
    ValidationResult validateOrderItems(const QList<OrderItem>& items);
    
    /**
     * @brief 重新计算订单金额
     * @param orderId 订单ID
     * @return 操作是否成功
     */
    bool recalculateOrderTotal(const QString& orderId);
    
    // ========================================================================
    // 统计和报表
    // ========================================================================
    
    /**
     * @brief 获取订单统计信息
     * @param startDate 开始日期(可选)
     * @param endDate 结束日期(可选)
     * @return 统计信息
     */
    OrderStatistics getOrderStatistics(const QDateTime& startDate = QDateTime(), 
                                      const QDateTime& endDate = QDateTime());
    
    /**
     * @brief 获取今日订单统计
     * @return 今日统计信息
     */
    OrderStatistics getTodayStatistics();
    
    /**
     * @brief 获取热销菜品统计
     * @param limit 返回数量限制
     * @return 菜品销量映射(菜品ID -> 销量)
     */
    QHash<QString, int> getPopularItemsFromOrders(int limit = 10);
    
    /**
     * @brief 获取顾客订单统计
     * @param customerId 顾客ID
     * @return 统计信息
     */
    OrderStatistics getCustomerOrderStatistics(const QString& customerId);
    
    // ========================================================================
    // 辅助方法
    // ========================================================================
    
    /**
     * @brief 生成唯一订单ID
     * @return 订单ID
     */
    static QString generateOrderId();
    
    /**
     * @brief 获取操作结果描述
     * @param result 操作结果
     * @return 描述字符串
     */
    static QString getOperationResultMessage(OrderOperationResult result);
    
    /**
     * @brief 格式化订单显示信息
     * @param order 订单信息
     * @return 格式化字符串
     */
    static QString formatOrderSummary(const Order& order);
    
    /**
     * @brief 获取状态显示文本
     * @param status 订单状态
     * @return 显示文本
     */
    static QString getStatusDisplayText(OrderStatus status);

signals:
    /**
     * @brief 订单创建信号
     * @param order 创建的订单
     */
    void orderCreated(const Order& order);
    
    /**
     * @brief 订单状态更新信号
     * @param orderId 订单ID
     * @param oldStatus 原状态
     * @param newStatus 新状态
     */
    void orderStatusUpdated(const QString& orderId, OrderStatus oldStatus, OrderStatus newStatus);
    
    /**
     * @brief 订单取消信号
     * @param orderId 订单ID
     * @param reason 取消原因
     */
    void orderCancelled(const QString& orderId, const QString& reason);
    
    /**
     * @brief 订单完成信号
     * @param orderId 订单ID
     */
    void orderCompleted(const QString& orderId);
    
    /**
     * @brief 库存不足信号
     * @param itemId 菜品ID
     * @param requiredQuantity 需要数量
     * @param availableStock 可用库存
     */
    void stockInsufficient(const QString& itemId, int requiredQuantity, int availableStock);
    
    /**
     * @brief 订单统计更新信号
     * @param statistics 最新统计信息
     */
    void statisticsUpdated(const OrderStatistics& statistics);
    
    /**
     * @brief 订单数据变更信号（用于外部文件变更时通知UI）
     */
    void ordersChanged();

public slots:
    /**
     * @brief 刷新订单数据
     */
    void refreshOrderData();
    
    /**
     * @brief 自动处理超时订单
     */
    void processTimeoutOrders();

private slots:
    void onTimeoutCheckTimer();
    void onStockStatusChanged(const QString& itemId, int oldStock, int newStock);
    void onExternalFileChanged(DataType dataType, const QString& filePath);

private:
    /**
     * @brief 加载订单数据到缓存
     * @return 操作是否成功
     */
    bool loadOrderData();
    
    /**
     * @brief 保存订单数据
     * @return 操作是否成功
     */
    bool saveOrderData();
    
    /**
     * @brief 验证订单搜索条件
     * @param order 订单
     * @param criteria 搜索条件
     * @return 是否匹配
     */
    bool matchesSearchCriteria(const Order& order, const OrderSearchCriteria& criteria);
    
    /**
     * @brief 更新菜品销量
     * @param items 订单项目列表
     */
    void updateMenuItemSales(const QList<OrderItem>& items);
    
    /**
     * @brief 处理订单状态变更的副作用
     * @param order 订单
     * @param oldStatus 原状态
     * @param newStatus 新状态
     */
    void handleStatusChangeEffects(const Order& order, OrderStatus oldStatus, OrderStatus newStatus);

private:
    static OrderManager* s_instance;
    
    DataManager* m_dataManager;
    MenuManager* m_menuManager;
    
    // 缓存数据
    QList<Order> m_orders;
    QHash<QString, QList<OrderItem>> m_stockReservations; // 订单ID -> 预留的库存项目
    
    // 定时器
    QTimer* m_timeoutCheckTimer;
    
    // 配置
    int m_orderTimeoutMinutes;    // 订单超时时间(分钟)
    bool m_autoProcessTimeout;    // 是否自动处理超时订单
    
    // 线程安全
    mutable QMutex m_mutex;
    
    // 状态标识
    bool m_isInitialized;
    bool m_dataLoaded;
    
    // 默认超时时间
    static const int DEFAULT_ORDER_TIMEOUT_MINUTES;
};

} // namespace RestaurantSystem

#endif // ORDERMANAGER_H
